//=================================================================================================
// Postion and material constant buffer
//=================================================================================================
cbuffer cbPerObject
{
	float4x4 wMatrix;
	float4x4 vMatrix;
	float4x4 pMatrix;
};


//=================================================================================================
// Cube map texture
//=================================================================================================
TextureCube gCubeMap;


//=================================================================================================
// Sampler state
//=================================================================================================
SamplerState samLinear
{
	Filter   = MIN_MAG_MIP_LINEAR;
	AddressU = Wrap;
	AddressV = Wrap;
};


//=================================================================================================
// Input struct vertex shader
//=================================================================================================
struct VertexIn
{
	float4 PosL : POSITION;
};


//=================================================================================================
// Input struct vertex shader
//=================================================================================================
struct VertexOut
{
	float4 PosH : SV_POSITION;
    float3 PosW : POSITION;
};


//=================================================================================================
// Vertex shader
//=================================================================================================
VertexOut VS(VertexIn vxin)
{
	VertexOut vout = (VertexOut)0;	
	vout.PosH = mul(vxin.PosL, wMatrix);
	vout.PosH = mul(vout.PosH, vMatrix);
	vout.PosH = mul(vout.PosH, pMatrix);
	vout.PosH = vout.PosH.xyww;
	vout.PosW = vxin.PosL.xyz;
	return vout;
}


//=================================================================================================
// Pixel shader
//================================================================================================= 
float4 PS(VertexOut pin) : SV_TARGET
{
	return gCubeMap.Sample(samLinear, pin.PosW);
}


//=================================================================================================
// Depth stencil state
//================================================================================================= 
DepthStencilState LessEqualDSS
{
    DepthFunc = LESS_EQUAL;
};


//=================================================================================================
// Technique shader
//=================================================================================================
technique11 SkyTech
{
    pass P0
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetGeometryShader(NULL);
        SetPixelShader(CompileShader(ps_5_0, PS()));        
        SetDepthStencilState(LessEqualDSS, 0);
    }
}